package pe.com.pgn.consolidadorventas.servidorcentral.quartz.jobs;

import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;

import pe.com.pgn.consolidadorventas.servidorcentral.dbo.Estacion;
import pe.com.pgn.consolidadorventas.servidorcentral.service.EstacionService;
import pe.com.pgn.consolidadorventas.servidorcentral.service.ProcedureService;
import pe.com.pgn.consolidadorventas.servidorcentral.service.ServidorCentralService;
import pe.com.pgn.consolidadorventas.servidorcentral.util.Constantes;
import pe.com.pgn.consolidadorventas.servidorcentral.util.FechasUtil;
import pe.com.pgn.consolidadorventas.servidorcentral.util.LoggerUtil;

public class PgnConsolidadorJobs {

	static Logger logger = Logger.getLogger(PgnConsolidadorJobs.class);
	
	EstacionService estacionService;
	ServidorCentralService servidorCentralService;
	ProcedureService procedureService;
	
	public void consolidacionPgn(){
		consolidarGlp();
		consolidarGnv();
	}
	
	public void consolidarGlp(){
		
		LoggerUtil.info(logger,"***********************************************************");
		LoggerUtil.info(logger,"Ejecucion de la tarea programada para consolidacion de GLP");
		try{
			//Consolidamos las estaciones de GLP
			//List<Estacion> lista  = (List<Estacion>)estacionService.obtenerEstacionesXTipoVenta(Constantes.TIPO_VENTA_GLP);
			List<Estacion> lista = estacionService.obtenerEstacionesOrdenCodEstacion(Constantes.TIPO_ARCHIVO_GLP,"asc");
			int limite = lista.size();
			
			if(limite>0){
				LoggerUtil.info(logger,"Consolidando Estaciones de GLP");
			}
			
			for(int i=0;i<limite;i++){
				try{
					Calendar cx = Calendar.getInstance();
					Estacion e = lista.get(i);
					
					int difFechas = FechasUtil.obtenerDiasDiferenciaEntreFechas(e.getFechaInicioOperaciones(), cx.getTime());
					
					//Debemos verificar el inicio de operaciones , no debe consolidar estaciones de inicio de fecha posterior a la actual
					if(difFechas>=0){
						if(e.getHabilitado()==Constantes.ESTACION_HABILITADO){
							//Restamos un dia para que consolide del dia anterior
							cx.add(Calendar.DAY_OF_MONTH,-1);
							servidorCentralService.consolidarInformacionEstacion(e,cx.getTime(),Constantes.TIPO_VENTA_GLP);
						}
					}
					
				}catch(Exception exc){
					LoggerUtil.error(logger,"Error en la consolidacion de estaciones de GLP :"+exc.getMessage());
				}
			}
			if(limite>0){
				LoggerUtil.info(logger,"Fin consolidacion estaciones de GLP");
			}
			
		}catch(Exception ex){
			LoggerUtil.error(logger,"Error en la consolidacion de estaciones de GLP :"+ex.getMessage());
		}
		
		LoggerUtil.info(logger,"Fin de la tarea programada para consolidacion de GLP");
		LoggerUtil.info(logger,"***********************************************************");
	}
	
	public void consolidarGnv(){
		
		LoggerUtil.info(logger,"***********************************************************");
		LoggerUtil.info(logger,"Ejecucion de la tarea programada para consolidacion de GNV");
		try{
			//Consolidamos las estaciones de GNV
			//List<Estacion> lista  = (List<Estacion>)estacionService.obtenerEstacionesXTipoVenta(Constantes.TIPO_VENTA_GNV);
			List<Estacion> lista = estacionService.obtenerEstacionesOrdenCodEstacion(Constantes.TIPO_ARCHIVO_GNV,"asc");
			int limite = lista.size();
			
			if(limite>0){
				LoggerUtil.info(logger,"Consolidando Estaciones de GNV");
			}
			for(int i=0;i<limite;i++){
				try{
					Calendar cx = Calendar.getInstance();
					Estacion e = lista.get(i);
					int difFechas = FechasUtil.obtenerDiasDiferenciaEntreFechas(e.getFechaInicioOperaciones(), cx.getTime());
					
					//Debemos verificar el inicio de operaciones , no debe consolidar estaciones de inicio de fecha posterior a la actual
					if(difFechas>=0){
						if(e.getHabilitado()==Constantes.ESTACION_HABILITADO){
							//Restamos un dia para que consolide del dia anterior
							cx.add(Calendar.DAY_OF_MONTH,-1);
							servidorCentralService.consolidarInformacionEstacion(e,cx.getTime(),Constantes.TIPO_VENTA_GNV);
						}
					}
					
				}catch(Exception exc){
					LoggerUtil.error(logger,"Error en la consolidacion de estaciones de GNV :"+exc.getMessage());
				}
			}
			
			if(limite>0){
				LoggerUtil.info(logger,"Fin de consolidacion de estaciones de GNV");
			}
		
		}catch(Exception ex){
			LoggerUtil.error(logger,"Error en la consolidacion de estaciones de GNV :"+ex.getMessage());
		}
		
		LoggerUtil.info(logger,"Ejecutando procedure de estadisticas");
		//Ejecutamos el procedure
		Calendar cx = Calendar.getInstance();
		cx.add(Calendar.DAY_OF_MONTH,-1);
		procedureService.ejecutarProcedureEstadisticasCierre(cx.getTime());
		
		LoggerUtil.info(logger,"Fin de la tarea programada para consolidacion de GNV");
		LoggerUtil.info(logger,"***********************************************************");

	}

	public ServidorCentralService getServidorCentralService() {
		return servidorCentralService;
	}

	public void setServidorCentralService(
			ServidorCentralService servidorCentralService) {
		this.servidorCentralService = servidorCentralService;
	}

	public ProcedureService getProcedureService() {
		return procedureService;
	}

	public void setProcedureService(ProcedureService procedureService) {
		this.procedureService = procedureService;
	}

	public EstacionService getEstacionService() {
		return estacionService;
	}

	public void setEstacionService(EstacionService estacionService) {
		this.estacionService = estacionService;
	}

}
